package com.air.service.impl;

import com.air.dto.BaggageDTO;
import com.air.dto.BaggagePageQueryDTO;
import com.air.entity.Baggage;
import com.air.mapper.BaggageMapper;
import com.air.result.PageResult;
import com.air.service.BaggageService;
import com.air.vo.BaggageVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;


@Service
public class BaggageServiceImpl implements BaggageService {

    @Autowired
    private BaggageMapper baggageMapper;


    /**
     * 添加行李订单。
     * 该方法通过接收一个行李DTO对象，创建一个新的行李实体对象，并将其保存到数据库中。
     * 它使用BeanUtils来复制DTO对象的属性到实体对象中，设置行李的开始和结束时间，
     * 然后通过baggageMapper的insert方法将行李实体插入数据库。
     *
     * @param baggageDTO 行李订单的DTO（数据传输对象），包含了行李的相关信息。
     */
    @Override
    public void save(BaggageDTO baggageDTO) {
        // 创建一个新的行李实体对象
        Baggage baggage = new Baggage();
        // 复制DTO对象的属性到实体对象中
        BeanUtils.copyProperties(baggageDTO,baggage);
        // 将行李实体插入数据库
        baggageMapper.insert(baggage);
    }

    /**
     * 分页查询行李信息。
     *
     * 本方法通过接收一个BaggagePageQueryDTO对象来执行分页查询。BaggagePageQueryDTO包含了分页信息（页码和每页大小）
     * 以及查询条件。使用PageHelper启动分页插件，以实现分页查询的效果。接着，调用baggageMapper的pageQuery方法来执行
     * 具体的查询操作，该方法返回一个Page<BaggageVO>对象，其中包含了查询结果和总记录数。最后，本方法使用这些信息来
     * 创建并返回一个PageResult对象，该对象包含了分页查询的结果。
     *
     * @param baggagePageQueryDTO 包含分页信息和查询条件的数据传输对象。
     * @return 返回一个PageResult对象，其中包含了分页查询的结果和总记录数。
     */
    @Override
    public PageResult pageQuery(BaggagePageQueryDTO baggagePageQueryDTO) {
        // 启动分页插件，设置当前页码和每页大小
        PageHelper.startPage(baggagePageQueryDTO.getPage(),baggagePageQueryDTO.getPageSize());

        // 执行查询操作，返回分页后的行李信息
        Page<BaggageVO> page = baggageMapper.pageQueryByPassenger(baggagePageQueryDTO);

        // 创建并返回PageResult对象，包含查询结果和总记录数
        return new PageResult(page.getTotal(),page.getResult());
    }


    /**
     * 旅客添加行李
     * @param baggageDTO
     */
    @Override
    public void saveByPassenger(BaggageDTO baggageDTO) {
        // 创建一个新的Baggage实例，用于后续的数据更新操作
        Baggage baggage = new Baggage();

        // 使用BeanUtils的copyProperties方法，将baggageDTO的对象属性复制到baggage对象中
        // 这一步是为了确保baggage对象中包含所有需要更新的数据
        BeanUtils.copyProperties(baggageDTO,baggage);

        // 调用baggageMapper的update方法，更新数据库中对应的baggage记录
        // 通过这一操作，实现了对baggage数据的更新
        baggageMapper.update(baggage);

    }

    /**
     * 批量删除
     * @param ids
     */
    @Override
    public void deleteBatch(List<Long> ids) {
        // 删除一批行李记录
        baggageMapper.deleteBatch(ids);

    }

    /**
     * 修改
     * @param baggageDTO
     */
    @Override
    public void update(BaggageDTO baggageDTO) {
        // 创建一个新的Baggage实例，用于后续的数据更新操作
        Baggage baggage = new Baggage();

        // 使用BeanUtils的copyProperties方法，将baggageDTO的对象属性复制到baggage对象中
        // 这一步是为了确保baggage对象中包含所有需要更新的数据
        BeanUtils.copyProperties(baggageDTO,baggage);

        // 调用baggageMapper的update方法，更新数据库中对应的baggage记录
        // 通过这一操作，实现了对baggage数据的更新
        baggageMapper.update(baggage);

    }

    /**
     * 根据id查询
     * @param id
     * @return
     */
    @Override
    public BaggageVO getById(Long id) {

        Baggage baggage = baggageMapper.getById(id);

         // 创建一个新的行李VO对象，用于存储从数据库查询到的行李信息。
        BaggageVO baggageVO = new BaggageVO();
         //将查询到的行李对象的属性复制到行李VO对象中。
        BeanUtils.copyProperties(baggage, baggageVO);

        // 返回转换后的行李VO对象。
        return baggageVO;

    }

    /**
     * 根据旅客id查询行李
     * @param id
     * @return
     */
    @Override
    public List<BaggageVO> getByPassengerId(Long id) {
        // 通过旅客ID查询行李数据库，获取原始的Baggage对象列表
        List<Baggage> baggageList = baggageMapper.getByPassengerId(id);
        // 初始化一个空的BaggageVO对象列表，用于存放转换后的数据
        List<BaggageVO> baggageVOList = new ArrayList<>();
        // 遍历原始的Baggage对象列表
        for (Baggage baggage : baggageList) {
            // 创建一个新的BaggageVO对象
            BaggageVO baggageVO = new BaggageVO();
            // 使用BeanUtils的copyProperties方法，将Baggage对象的属性值复制到BaggageVO对象中
            BeanUtils.copyProperties(baggage, baggageVO);
            // 将转换后的BaggageVO对象添加到列表中
            baggageVOList.add(baggageVO);
        }
        // 返回转换后的BaggageVO对象列表
        return baggageVOList;
    }

    /**
     * 退行李
     * @param ids
     */
    @Override
    public void refund(List<Long> ids) {
        // 调用baggageMapper的deleteBatch方法，删除指定id的行李记录
        baggageMapper.deleteBatch(ids);
    }

    /**
     * 根据航空公司id查询行李
     * @param id
     * @return
     */
    @Override
    public List<BaggageVO> list(Long id) {
        // 根据给定的ID查询行李列表
        List<Baggage> baggageList = baggageMapper.list(id);

        // 初始化一个空的VO列表，用于存储转换后的行李数据
        List<BaggageVO> baggageVOList = new ArrayList<>();

        // 遍历查询到的行李列表，将每个Baggage对象转换为BaggageVO对象
        for (Baggage baggage : baggageList) {
            BaggageVO baggageVO = new BaggageVO();
            // 使用BeanUtils的copyProperties方法进行对象属性的复制
            BeanUtils.copyProperties(baggage, baggageVO);
            // 将转换后的BaggageVO对象添加到VO列表中
            baggageVOList.add(baggageVO);
        }

        // 返回转换后的行李VO列表
        return baggageVOList;

    }
}
